package xyz.heyaoshare.utils;

import cn.hutool.extra.servlet.JakartaServletUtil;
import cn.hutool.http.HttpUtil;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import java.util.Map;

/**
 * HTTP 工具类【基于hu-tool】
 * @author YueHe
 * @version 0.0.1
 * @since 2025/6/25 上午10:28
 */
public class HttpUtils extends HttpUtil {

    /**
     * 获取当前请求对应的HttpServletResponse对象。
     *
     * @return 当前请求对应的HttpServletResponse对象
     */
    public static HttpServletResponse getResponse() {
        RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
        if (!(requestAttributes instanceof ServletRequestAttributes)) {
            return null;
        }
        return ((ServletRequestAttributes) requestAttributes).getResponse();
    }

    /**
     * 获取当前HTTP请求对象
     *
     * @return 当前HTTP请求对象
     */
    public static HttpServletRequest getRequest() {
        RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
        if (!(requestAttributes instanceof ServletRequestAttributes)) {
            return null;
        }
        return ((ServletRequestAttributes) requestAttributes).getRequest();
    }

    /**
     * 获取客户端的IP地址。
     *
     * @return 客户端的IP地址，如果当前线程没有HttpServletRequest对象，则返回null。
     */
    public static String getClientIP() {
        HttpServletRequest request = getRequest();
        if (request == null) {
            return null;
        }
        return JakartaServletUtil.getClientIP(request);
    }

    /**
     * 获取客户端的IP地址。
     *
     * @param request HttpServletRequest对象
     * @return 客户端的IP地址
     */
    public static String getClientIP(HttpServletRequest request) {
        return JakartaServletUtil.getClientIP(request);
    }

    /**
     * 获取HttpServletRequest请求体的内容。
     *
     * @param request HttpServletRequest对象
     * @return 请求体的内容
     */
    public static String getBody(HttpServletRequest request) {
        return JakartaServletUtil.getBody(request);
    }

    /**
     * 获取HttpServletRequest请求中的所有参数，并以Map的形式返回。
     *
     * @param request HttpServletRequest对象
     * @return 包含所有请求参数的Map，其中键为参数名，值为参数值
     */
    public static Map<String, String> getParamMap(HttpServletRequest request) {
        return JakartaServletUtil.getParamMap(request);
    }

}
